home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Programming / JForth / Extras / SysGen / DISM < prev    next >
Encoding:
Text File  |  1992-01-26  |  25.2 KB  |  898 lines

  1.  
  2. \ btd sept 30 86.  fixed odd adr crash, tabs, added cycle calc.
  3. \ 36 sec to compiler from floppy, 28 sec from ram disk.  14,200 bytes. 
  4.  
  5. \ 02-jan-87  mdh  for 1.1 ... NIB4:14 checks if calling thru +64k or ORG before
  6. \                 deciding it is calling within the kernal.  Also, modified
  7. \                 to decode both in DEF.  Also, DEF resets DISM-ORIGIN.
  8.  
  9. \ 05-oct-87  mdh  fixed many problems...relative branch addresses now show
  10. \                 correct value based on DISM-ORIGIN...added RELDISM so that
  11. \                 an address can be DISM'ed relative to another address...
  12. \                 fixed JSR ABS.L to print the called name, if appropriate...
  13. \                 DC.W was not being initialized correctly; if seen, could
  14. \                 screw up next opcode.
  15.  
  16. \ 27-may-88  mdh  NIB11 was using wrong value for checking cmpm.
  17.  
  18. \ 27-feb-89  mdh  NIB4:4 printed MOVE <EA>,ccr arguments in wrong order
  19.  
  20. \ 01-mar-89  mdh  re-instated '.w' size in word arguments (Why taken out?)
  21.  
  22. \ 21-may-89  mdh  LINK must set word-size for operand data (nib4-reg)
  23.  
  24. \ 05-aug-89  mdh  Print ascii values for opcodes if DISM-CYCLES off.
  25.  
  26. \ 00001 25-sep-91 mdh     fix NIB14
  27. \ 00002 30-nov-91 mdh     incorporate Marty Kees' 68881 support
  28. \ 00003 26-dec-91 mdh     some words to FORTH vocab, better DISM control
  29. \ 00004 03-jan-92 mdh/plb removed OF ... ELSE abortions
  30. \ 00005 25-jan-92 mdh     remover USER definitions
  31.  
  32.  
  33. \ ********************** OK, lets get all our tools  ***********************
  34. FALSE .IF
  35.     known bugs: - some timings are inexact. off by as much as 4 cycles.
  36. .THEN
  37.   
  38. FORTH DEFINITIONS
  39. INCLUDE? CONDITION jf:CONDITION
  40. INCLUDE? @BITS jf:@BITS
  41. INCLUDE? SELECT jf:SELECT
  42. INCLUDE? $TABLE jf:$TABLE
  43.  
  44. DECIMAL
  45.  
  46. anew TASK-DISM
  47.  
  48. : dism-words ;
  49.  
  50. .NEED B->S
  51. : B->S   ( BYTE--- N ) 255 AND DUP 127 >
  52.       IF [ 127 COMP ] LITERAL OR   THEN ;
  53. .THEN
  54.  
  55. .NEED >FIG-FLAG
  56. : >FIG-FLAG ( FLAG --- FIG-FLAG-1-OR-0 )  IF 1 ELSE 0 THEN ;
  57. .THEN
  58.  
  59. .NEED ?EVEN
  60. : ?EVEN  ( ADR --- EVEN-ADR )  ( and a warning if odd ) DUP 1 AND 
  61.        IF   CR ." garbage odd address.  incrementing to even" 1+ CR 
  62.        THEN ;
  63. .THEN
  64.  
  65. .NEED FIG-VAR
  66. : FIG-VAR  ( INIT-VALUE --- )  ( WORD --IN-- )
  67.    [] variable ( 00005 )  LATEST   NAME>   EXECUTE  ! ;
  68. .THEN
  69.  
  70.  
  71. .NEED COLUMN
  72. : COLUMN ( column --- )  dup out @ <
  73.   IF   CR
  74.   THEN OUT @ - ABS SPACES ; 
  75. .THEN 
  76.  
  77. \ ********************** ready to start for real! ***********************
  78.  
  79. ONLY FORTH DEFINITIONS 
  80.  
  81. \ start 00003 -- moved to FORTH so 'showhunks' can use DISASSEM.MOD
  82. ( 00005 )  variable DISM-ORIGIN 
  83. true fig-var .REGNAMES?
  84. ( 00005 )  variable  SHOW-CYCLES  SHOW-CYCLES ON
  85. \ end 00003
  86.  
  87. EXISTS? UNCODE
  88. .IF    FORGET UNCODE 
  89. .THEN
  90.  
  91. VOCABULARY UNCODE IMMEDIATE
  92.  
  93. ALSO  FORTH
  94. UNCODE DEFINITIONS
  95.  
  96. DECIMAL
  97. 0 FIG-VAR DISM-ADR
  98. 0 FIG-VAR DISM-SIZE      0 FIG-VAR DISM-DONE
  99. 0 FIG-VAR HIGH-BRANCH    0 FIG-VAR START-ADR
  100. -1 U2/ FIG-VAR LOW-BRANCH
  101. 0 FIG-VAR NEW-DISM-ADR
  102.  
  103.  6 FIG-VAR  ADR.R
  104.  8 FIG-VAR  OPCODE-COL   
  105. 16 FIG-VAR  ARG-COL 
  106. 43 FIG-VAR  CODE-COL 
  107. 60 FIG-VAR  CYCLE-COL 
  108. 74 FIG-VAR  FINAL-COL 
  109.  
  110. : >ARG  ( --- )  ARG-COL @ COLUMN ;
  111.  
  112. ( 00005 )  variable  #CYCLES
  113. ( 00005 )  variable  #CYCLES/
  114. : +CYCLES  ( N --- )  #CYCLES +! ;
  115. : +LONG  ( N --- )  ( add 4 cycles if size long )  DISM-SIZE @ 2 = 
  116.       IF 4 +  THEN +CYCLES ;
  117.  
  118. : LONG?  ( --- FLAG ) DISM-SIZE @ 2 = ; 
  119. : +CYCLES/  ( N --- ) #CYCLES/ +! ;
  120. : +IF-LONG ( CYCLES +IF-LONG --- )  LONG? 
  121.       IF    + 
  122.       ELSE  DROP
  123.       THEN  +CYCLES ;
  124.  
  125. ( 00005 )  variable  MEM
  126. : IS-MEM  ( --- )  MEM ON ;
  127. ( 00005 )  variable  APPROX
  128. : +MEM  ( CYCLE --- )  MEM @ IF DUP +CYCLES THEN DROP  ;
  129.  
  130. : DONE? ( -- )  HIGH-BRANCH @    DISM-ADR @ >  NOT  DISM-DONE !  ;
  131.  
  132. DECIMAL
  133. 0 FIG-VAR OPCODE
  134. : OPP  ( --- OPP-WORD )  OPCODE @ ;
  135.  
  136. : @OPP-BITS  ( OFF #BITS--- N ) >R >R OPP R> R> @BITS ;
  137. : OPP-BIT?  ( BIT# --- FLAG ) OPP SWAP BIT-SET? >FIG-FLAG  ;
  138. : OPP-BITS? CREATE ( BIT# --- )  ,
  139.         DOES>  ( <PFA> --- FLAG )    @ OPP-BIT? >FIG-FLAG  ;
  140.  
  141. 8   OPP-BITS?    8?
  142. 6   OPP-BITS?    6?
  143. 7   OPP-BITS?    7?
  144. 5   OPP-BITS?    5?
  145. 3   OPP-BITS?    3?
  146.  
  147. : 6&7   ( --- VAL )  6 2 @OPP-BITS ;
  148. : 6&7?   ( --- FLAG )  6&7 3 = ;
  149. : OPP/9  ( --- OPP/9  )  OPP 9 -shift ;
  150. : OPP/6  ( --- OPP/6  )  OPP 6 -shift ;
  151. : OPP/3  ( --- OPP/3  )  OPP 3 -shift ;
  152.  
  153. : A2+  ( --- ) 2 DISM-ADR @ + ?EVEN DISM-ADR ! ;
  154. : PAR1 ( --- paramter1 )  DISM-ADR @ 2+ W@ W->S ;
  155. : .#  ." #" ;
  156. : BIN.#  ( --- )  ( binary .IMM , byte-size )
  157.     ." #%" PAR1   0 .R        A2+   ;
  158.  
  159. : .,  ( --- )  ." ," ;
  160.  
  161. \ : CHECK-EA-ABS  ( -- flag , check for valid effective address combos )
  162. \   3 3 @opp-bits 7 =
  163. \   IF    0 3 @opp-bits 2 <
  164. \   ELSE  true
  165. \   THEN  ;
  166. \ : CHECK-EA-&PC  ( -- flag , check for valid effective address combos )
  167. \   3 3 @opp-bits 7 =
  168. \   IF    0 3 @opp-bits 5 <
  169. \   ELSE  true
  170. \   THEN  ;
  171.  
  172. DECIMAL
  173. : SET-SIZE  ( --- ) 6 2 @OPP-BITS  DISM-SIZE ! ;
  174.  
  175. 4 $TABLE SIZE-TEXT  ".b" ".w" ".l" "?"
  176. : SIZE$  SIZE-TEXT  >ARG  ;
  177. : .SIZE  ( --- ) DISM-SIZE @ 3 MIN SIZE$  ;
  178.  
  179. : .LONG  2 SIZE$  ;
  180. : .WORD  1 SIZE$  ;
  181. : .BYTE  0 SIZE$  ;
  182.  
  183. DECIMAL
  184. : .BASE-CHAR  ( --- )  BASE @
  185.     CASE   16  OF ." $"   ENDOF
  186.             2  OF ." %"   ENDOF
  187.     ENDCASE  ;
  188.  
  189. : .IMM  ( --- )  .#   .BASE-CHAR
  190.      DISM-ADR @ 2+  DISM-SIZE @
  191.      CASE   0   OF  1+   C@    B->S   ENDOF
  192.             1   OF  W@   W->S         ENDOF
  193.             2   OF  @    A2+          ENDOF
  194.      ENDCASE  A2+  0 .R    4 +LONG       ;
  195.  
  196. DECIMAL
  197. 8 $TABLE AREGS
  198.      "a0"     "a1"     "loc"    "+64k"   "org"     "up"   "dsp"   "rp"
  199. 8 $TABLE AREGS-68K
  200.      "a0"     "a1"     "a2"     "a3"     "a4"      "a5"   "a6"    "a7"
  201. 8 $TABLE DREGS
  202.      "d0"     "d1"     "d2"     "d3"     "d4"    "iloop" "jloop"  "tos"
  203. 8 $TABLE DREGS-68K
  204.      "d0"     "d1"     "d2"     "d3"     "d4"      "d5"   "d6"    "d7"
  205.  
  206. DECIMAL
  207. : .AREG  ( opp --- )   7 AND  .REGNAMES? @
  208.   IF   AREGS
  209.   ELSE AREGS-68K
  210.   THEN  ;
  211. : .DREG  ( opp --- )   7 AND  .REGNAMES? @
  212.   IF   DREGS
  213.   ELSE DREGS-68K
  214.   THEN  ;
  215.  
  216. \ 0 CONSTANT DUMMY \ named dummy value for such functions as endcase
  217. \ : .DREG  ( 0-7 --- )   7 AND  
  218. \     CASE    7  OF  ." TOS"   ENDOF
  219. \             6  OF  ." LOOP2" ENDOF
  220. \             5  OF  ." LOOP1" ENDOF 
  221. \       ." D"  0  .R   DUMMY 
  222. \     ENDCASE  ;
  223.  
  224. : .(  ." ("  ;
  225.  
  226. : .)  ." )"  ;
  227. : .AN     ( opp --- )  .AREG     ;
  228. : .A@     ( opp --- )  .( .AREG .)      4 +CYCLES IS-MEM  ;
  229. : .A@+    ( opp --- )  .( .AREG ." )+"  4 +CYCLES IS-MEM  ;
  230. : .-A@   ( opp --  )  ." -(" .AREG .)   6 +CYCLES IS-MEM  ;
  231. : .NUM ( n --- )   .BASE-CHAR  0 .R     ;
  232.  
  233. FALSE FIG-VAR DC.W?
  234. : .DW   ( --- )
  235.   BEGIN  out @  opcode-col @ >
  236.   WHILE  bsout @ emit
  237.   REPEAT ." dc.w " >ARG  OPP .num   DC.W? ON    ;
  238.  
  239. : .PAR1-SIZE ( --- )   PAR1 11 BIT-SET?
  240.    IF    ." .l"
  241.    else  ." .w"
  242.    THEN    ;
  243.  
  244. DECIMAL
  245.  
  246. : IN-DICT?   ( adr -- flag , true if in side image and valid nfa )
  247.   >R  R 0< NOT   R HERE <     AND
  248.   R>  >NAME  VALID-NAME? AND  ;
  249.  
  250. : .ADR  ( ADR --- )  ( ." ADR" )  DISM-ORIGIN  @ -  ADR.R @ .R   ;
  251.  
  252. FALSE FIG-VAR DOING-CALL
  253. : .CALLED-NAME?  ( cfa -- , IF calling a cfa, print name )
  254.   DOING-CALL @  .REGNAMES? @ AND  DISM-ORIGIN @ 0= AND
  255.   IF   OPP JSR+64K-CODE =
  256.        IF  $ 1,0000 +
  257.        THEN DUP IN-DICT?
  258.        IF   DUP ."  = " >NAME ID.
  259.        THEN
  260.   THEN DROP  ;
  261.  
  262. : .ARGS-ADR  ( ADR -- )   \  (this is ABSOLUTE!)  DISM-ORIGIN @ -
  263.   BL  ARG-COL @  EMIT-TO-COLUMN DUP .NUM
  264.   dism-origin @ -  .CALLED-NAME?   ;   
  265.  
  266. : .ARGS-RELADR  ( ADR -- )    DISM-ORIGIN @ -
  267.   BL  ARG-COL @  EMIT-TO-COLUMN DUP .NUM
  268.   dism-origin @ -  .CALLED-NAME?   ;   
  269.  
  270. DECIMAL
  271. : .,R)  ( --- )  .,  PAR1 12 3 @BITS  PAR1 15 BIT-SET? ( OPP-BIT?  ) 
  272.    IF    .AREG
  273.    ELSE  .DREG
  274.    THEN  .PAR1-SIZE  .)  ;
  275.  
  276. : .AN+W    ( opp --- )   PAR1  .NUM  .A@ 
  277.   DISM-ADR @ 2+ W@ W->S    .CALLED-NAME?
  278.   A2+  4 +LONG  IS-MEM  ;
  279.  
  280. : .PAR1   ( --- )  PAR1  B->S .NUM ;
  281.  
  282. : .AN+R+B  ( opp--- ) .PAR1  .( .AREG   .,R)
  283.   A2+  10 +CYCLES IS-MEM  ;
  284.  
  285. : .PC+R+B  (  --- )   .PAR1  ." (pc"    .,r)    A2+  10 +CYCLES IS-MEM ;
  286.  
  287. : .PC+W (  --- )    PAR1 .NUM  ." (pc)"   A2+   8 +CYCLES IS-MEM ;
  288.  
  289. : .ABS.W  ( --- )  PAR1
  290.   >rel .ARGS-RELADR  ." .w"  A2+   8 +CYCLES IS-MEM ;
  291.  
  292. : .ABS.L ( --- )  DISM-ADR @ 2+ @ \ dup   .ARGS-ADR  >rel .CALLED-NAME?
  293.   >rel .ARGS-RELADR  4 DISM-ADR +!  12 +CYCLES  ;
  294.  
  295. : .EXT   ( OPP --- )   7  AND
  296.       SELECT      .ABS.W .ABS.L .PC+W .PC+R+B   .IMM  .DW  .DW  .DW
  297.       END-SELECT   ( --- )  ;
  298.  
  299. : .SOURCE  ( --- )  OPP     3 3  @OPP-BITS
  300.       SELECT     .DREG     .AN       .A@       .A@+
  301.                  .-A@      .AN+W     .AN+R+B   .EXT
  302.       END-SELECT  ( opp selector--- )  ;
  303.  
  304. : ,SOURCE  ., .SOURCE ;
  305.  
  306. : ,AREG    ., .AREG  ;
  307.  
  308. : ,DREG    ., .DREG  ;
  309.  
  310. FALSE FIG-VAR .ED-M
  311. : ?., (  --- )  .ED-M @ IF .,      THEN .ED-M  ON  ;
  312. : ?./ (  --- )  .ED-M @ IF   ." /" THEN .ED-M  ON  ;
  313.  
  314. DECIMAL 
  315. : dismCR?  ( --- )   OUT @ CODE-COL @ 3 - > 
  316.     IF    CR  ARG-COL @ COLUMN   
  317.     THEN ;
  318.  
  319. variable laston  variable lastoff  variable leadchar
  320. variable #seq    variable rtype    variable #mcyc
  321. variable dstart  variable astart   variable .movr'd
  322.  
  323. : .MOVR  ( reg# -- )  rtype @ ascii a -
  324.   IF   .dreg
  325.   ELSE .areg
  326.   THEN .movr'd on dismcr? ;
  327.  
  328. : .leadchar  ( -- )
  329.   leadchar @ ?dup
  330.   IF
  331.      .movr'd @
  332.      IF
  333.         dup emit
  334.      THEN
  335.      drop
  336.   THEN
  337. ;
  338.  
  339. : .on  ( #b -- ) dup laston @ - 1-
  340.   IF   .leadchar  dup .movr  ascii - leadchar !  #seq off
  341.   ELSE 1 #seq +!
  342.   THEN laston !  #mcyc @ dup +IF-LONG  ;
  343.  
  344. : .off ( #b -- )  dup lastoff @ - 1-
  345.   IF   #seq @
  346.        IF   .leadchar  laston @ .movr
  347.        THEN   ascii / leadchar !
  348.   THEN lastoff !  0 #seq !  ;
  349.  
  350. : initmovm   ( char -- )  rtype !
  351.   -10 laston !  -1 lastoff !  leadchar off #seq off  ;
  352.  
  353. : ?last  lastoff @ 2+ .off   ;
  354.  
  355. : .REGLIST  ( par #cycles A-start D-start --- )
  356.   dstart !  astart !  #mcyc !    ascii d  .movr'd off  initmovm   8 0  
  357.   DO   dup  dstart @ i - abs bit-set?  i swap
  358.        IF    .on
  359.        ELSE  .off
  360.        THEN
  361.   LOOP ?last  8 0  ascii a initmovm  ascii / leadchar !
  362.   DO   dup  astart @ i - abs bit-set?  i swap
  363.        IF    .on
  364.        ELSE  .off
  365.        THEN
  366.   LOOP ?last  DROP    ;   DECIMAL
  367.  
  368. : .MOVEM  ( --- )  .ED-M OFF  PAR1  3 3 @OPP-BITS 4 =
  369.   IF   ( A7-A0,D7-D0 )  4  7 15
  370.   ELSE ( d0-d7,a0-a7 )  5 -8  0
  371.   THEN .reglist  a2+  ;
  372.  
  373.  
  374. : NIB4:0   ( --- )   6&7?
  375.      IF     ." move"  .WORD   ." sr,"   6   +CYCLES 
  376.      ELSE   ." negx"  .size             4 2 +IF-LONG 
  377.      THEN  .SOURCE  ;
  378.  
  379. : DISM-CLR  (  --- )  ." clr"  .SIZE  .SOURCE  4 2 +IF-LONG ;
  380.  
  381. : NIB4:4  (  --- )    6&7?
  382.      IF     ." move" .WORD  .SOURCE  ." ,ccr"  ( WRONG? ) 12 +CYCLES
  383.      ELSE   ." neg"  .SIZE  4 2 +IF-LONG .SOURCE
  384.      THEN   ;
  385.  
  386. : NIB4:6   ( --- )   6&7?
  387.      IF      ." move"  .WORD  .SOURCE  ." ,sr"  12 +CYCLES
  388.      ELSE    ." not"   .LONG  .SOURCE           6  +CYCLES  2 +MEM   
  389.      THEN      ;
  390.  
  391. : NIB4:8  ( --- )  6&7
  392.   CASE
  393.    0  OF     ." nbcd"   .BYTE   .SOURCE 6 +CYCLES   2 +MEM  ENDOF
  394.    1  OF     ." pea"  ( .LONG ) >arg .SOURCE 4 +CYCLES           ENDOF
  395.    ." movem" 6? 1+  SIZE$      
  396.     .MOVEM  ., .SOURCE         12   +CYCLES     
  397.   ENDCASE     ;
  398.  
  399. : NIB4:10  (  --- )   6&7?
  400.     IF      ." tas"  .BYTE       6 +MEM  
  401.     ELSE    ." tst"  6&7 SIZE$    
  402.     THEN  .SOURCE   4 +CYCLES ;
  403.  
  404. : NIB4:14   (  --- )  7?
  405.    IF  6?   2 DISM-SIZE ! 
  406.        IF    ." jmp"   DONE?   APPROX ON  
  407.        ELSE  ." jsr"   8 +CYCLES
  408.              \ check if doing a call thru +64k or ORG
  409.              3 3 @OPP-BITS 5 =
  410.              0 3 @OPP-BITS dup 3 = swap 4 = or  ( -- an+w-flag a3-or-a4-flag )
  411.              AND opp $ 4eb9 = or  DOING-CALL !
  412.        THEN  ( .LONG ) >arg .SOURCE
  413.    ELSE   0 4 @OPP-BITS      ." trap"  >ARG  .#  .NUM
  414.    THEN  ;
  415.  
  416. : NIB4:12  (  --- ) ( opp,movem-mask,ext)
  417.    ." movem"  6?  1+   SIZE$    8 +CYCLES  
  418.    DISM-ADR @ >R    (   6?  )  A2+ .SOURCE
  419.    R> DISM-ADR @ >R DISM-ADR !  .,    .MOVEM  
  420.    R> DISM-ADR !  ;
  421.  
  422. : NIB4-UNIQUE  (  --- )    OPP/9 6?
  423.   IF      ." lea"  >ARG    .SOURCE ,AREG    APPROX ON 
  424.   ELSE    ." chk.w"  >ARG  OPP $ 3f and  $ 3c =
  425.           IF
  426.              1 DISM-SIZE !  ( set WORD size )
  427.           THEN
  428.           .SOURCE ,DREG   8 +CYCLES
  429.   THEN   ;
  430.  
  431. : NIB4-SPECIAL ( --- ) 
  432.    OPP $ 100  AND
  433.    IF    NIB4-UNIQUE
  434.    ELSE  ( JMP )  9 3 @OPP-BITS
  435.           SELECT      NIB4:0    DISM-CLR    NIB4:4    NIB4:6
  436.                       NIB4:8    NIB4:10     NIB4:12   NIB4:14
  437.           END-SELECT
  438.    THEN ;
  439.  
  440. DECIMAL
  441. : .NIB4-REG     ( --- )  OPP DUP   $ FFF8 AND CASE
  442.   $ 4E68  OF    ." move"  >ARG  ." usp,"   .AREG   6 +CYCLES 2 +MEM  ENDOF
  443.   $ 4E60  OF    ." move"  >ARG  .AREG    ." ,usp"  4 +CYCLES         ENDOF
  444.   $ 4E58  OF    ." unlk"  >ARG  .AREG             12 +CYCLES         ENDOF
  445.   $ 4880  OF    ." ext"  .WORD .DREG              4 +CYCLES         ENDOF
  446.   $ 4E50  OF    ." link"  >ARG  .AREG .,
  447.                 1 dism-size !   .IMM  18 +CYCLES         ENDOF
  448.   $ 4840  OF    ." swap"  >ARG  .DREG              4 +CYCLES         ENDOF
  449.   $ 48C0  OF    ." ext"  .LONG .DREG              4 +CYCLES         ENDOF
  450.      DROP  NIB4-SPECIAL
  451.   ENDCASE  ;
  452. DECIMAL
  453.  
  454. DECIMAL
  455. : NIB4  ( --- )   OPP
  456. CASE  
  457.   $ 4E76  OF  ." trapv"                4 +CYCLES  ( 34 +IF )  ENDOF
  458.   $ 4E75  OF  ." rts"           DONE? 16 +CYCLES          ENDOF
  459.   $ 4E73  OF  ." rte"           DONE? 20 +CYCLES          ENDOF
  460.   $ 4E72  OF  ." stop"   BIN.#  DONE?  4 +CYCLES          ENDOF
  461.   $ 4E70  OF  ." reset"              123 +CYCLES          ENDOF
  462.   $ 4E71  OF  ." nop"                  4 +CYCLES          ENDOF
  463.   $ 4E77  OF  ." rtr"           DONE? 20 +CYCLES          ENDOF
  464.   $ 4AFA  OF  ." illegal"             34 +CYCLES          ENDOF
  465.   $ 4AFB  OF  ." illegal"             34 +CYCLES          ENDOF
  466.   $ 4AFC  OF  ." illegal"             34 +CYCLES          ENDOF
  467.       .NIB4-REG
  468. ENDCASE  ;
  469.  
  470. : .DEST  ( --- )  OPP  >R
  471.        9 3 @OPP-BITS    OPP/3  $ 38 AND     OR
  472.        OPCODE !   ,SOURCE R> OPCODE  !  ;
  473.  
  474. DECIMAL
  475. : NIB1-3   ( --- )  12 2 @OPP-BITS  4 +CYCLES 
  476.    CASE  1 OF  0  ENDOF  
  477.          2 OF  2  ENDOF
  478.          3 OF  1  ENDOF
  479.        ." illegal move size "  decimal QUIT
  480.    ENDCASE   DISM-SIZE !    
  481.      ." move"  .SIZE
  482.    .SOURCE DC.W? @ NOT
  483.    IF  .DEST  
  484.    THEN   4 +MEM    ;
  485.  
  486. 4 $TABLE  DYN$  "btst"   "bchg"  "bclr"  "bset"
  487.  
  488. : .STAT-BIT  ( --)  0 dism-size !  6&7  DYN$ >ARG
  489.   .IMM ( A2+ -- removed 1/24/87 mdh )
  490.   ,SOURCE ;
  491.  
  492. : NIB0-UNIQUE  ( --- )
  493.   CONDITION   3 3 @OPP-BITS 1 =
  494.       IF    ." movep"   OPP/9  OPP 6? 1+  DISM-SIZE ! .SIZE 7?
  495.             IF    ( REG=>MEM )  .DREG  .,  .AN+W
  496.             ELSE    .AN+W  ,DREG
  497.             THEN   16 8 +IF-LONG 
  498.       ELSE  8?
  499.       IF    6&7 DYN$ >ARG OPP/9 .DREG ,SOURCE  6 2 +IF-LONG  2 +CYCLES/
  500.       ELSE   ." eori"  .SIZE  .IMM ,SOURCE  8 8 +IF-LONG  4 +MEM 
  501.    ENDCOND  ;
  502.  
  503. 7 $TABLE   NIB0$    "or"  "and"  "sub"   "add"  "???"  "eor"  "cmp"
  504.  
  505. : NIB0-DEST  ( --- )  9 3 @OPP-BITS  NIB0$
  506.    .SIZE  .IMM    ,SOURCE  8 8 +IF-LONG  4 +MEM    ;
  507.  
  508. : NIB0   ( --- )   OPP 
  509.   CASE   
  510.    $  3C  OF    ." or"    .BYTE   BIN.# ." ,ccr" ENDOF
  511.    $  7C  OF    ." or"    .WORD   BIN.# ." ,sr"  ENDOF
  512.    $ 23C  OF    ." and"   .BYTE   BIN.# ." ,ccr" ENDOF
  513.    $ 27C  OF    ." and"   .WORD   BIN.# ." ,sr"  ENDOF
  514.    $ A3C  OF    ." eor"   .BYTE   BIN.# ." ,ccr" ENDOF
  515.    $ A7C  OF    ." eor"   .WORD   BIN.# ." ,sr"  ENDOF
  516.      8 4 @OPP-BITS
  517.       SELECT  NIB0-DEST  NIB0-UNIQUE  NIB0-DEST   NIB0-UNIQUE
  518.               NIB0-DEST  NIB0-DEST    NIB0-DEST   NIB0-UNIQUE
  519.               .STAT-BIT  NIB0-UNIQUE  NIB0-UNIQUE NIB0-UNIQUE
  520.               NIB0-DEST  NIB0-UNIQUE  NIB0-UNIQUE NIB0-UNIQUE
  521.       END-SELECT  DROP EXIT 
  522.   ENDCASE  [ DECIMAL ] 20 +CYCLES  ;
  523.  
  524. DECIMAL 
  525. 16 $TABLE .COND$  "ra" "f" "hi" "ls" "cc" "cs" "ne" "eq" "vc" "vs" "pl" "mi" "ge" "lt" "gt" "le"
  526.  
  527.  
  528. : .COND  ( --- )  8 4 @OPP-BITS  .COND$  ;
  529.  
  530. : SET-HIGH-BRANCH ( ADR --- )  HIGH-BRANCH @ MAX HIGH-BRANCH ! ; 
  531.  
  532. : UNCOND-BRA?  ( ADR --- ) >R R  DISM-ADR @ - 50 >
  533.     DONE?  DISM-DONE @   AND  DISM-DONE !
  534.     R@  START-ADR @ < DISM-DONE !  R> SET-HIGH-BRANCH  ;
  535.  
  536. : COND-BRA?  ( ADDR --- )   8 4 @OPP-BITS
  537.   IF     SET-HIGH-BRANCH
  538.   ELSE   UNCOND-BRA?
  539.   THEN ;
  540.  
  541. : NIB5   ( --- )   6&7?
  542.   IF   ( DBCC OR SCC ) OPP  [ BINARY ]  111000 AND 1000 =
  543.          IF    ." db" .COND  .WORD  OPP .DREG  [ DECIMAL ]
  544.                PAR1  DISM-ADR @  +  2+  DUP COND-BRA? ., .ARGS-RELADR
  545.                A2+     10 +CYCLES ( 4 +DID'NT ) 
  546.          ELSE  ." s" .COND >ARG  .SOURCE 4 2 +IF-LONG  APPROX ON
  547.          THEN
  548.   ELSE  ( QUICK )  8?
  549.         IF    ." subq"   
  550.         ELSE  ." addq"  
  551.         THEN  .SIZE  9 3 @OPP-BITS DUP 0=
  552.         IF      8 +
  553.         THEN    .# .NUM   ,SOURCE   4 +LONG  4 +MEM  ( +4 AN ) APPROX ON  
  554.         ( : 2 +MEM-IF-LONG  4 +IF-AN ) 
  555.   THEN  ;
  556.  
  557. : NIB6   ( --- )
  558.    OPP 255 AND 0=
  559.    IF    PAR1   A2+  1 DISM-SIZE !
  560.    ELSE  OPP B->S 2+  0 DISM-SIZE !
  561.    THEN   ( bra-offset )  DISM-ADR @ +  ( DISM-SIZE @ 2* + )
  562.    ( ABS-ADR )   8 4 @OPP-BITS  1 =
  563.    IF    ." bsr"       DOING-CALL ON        18 +CYCLES
  564.    ELSE  ." b" .COND   DUP    COND-BRA?     10 +CYCLES  ( -2 +2 IF-LONG-DID'T)
  565.    THEN  DISM-SIZE @ 
  566.    IF    ." .l"
  567.    ELSE  ." .s"
  568.    THEN  .ARGS-RELADR  ;
  569.  
  570. : .MOVEQ  ( --- )  ." moveq.l" >ARG OPP 255 AND B->S ascii # emit .NUM
  571.      OPP/9  ,DREG  4 +CYCLES    ;
  572.  
  573. DECIMAL
  574. : NIB8  ( --- )
  575.    6&7?
  576.    IF     8?  ." div" 
  577.           IF    ASCII s 158 +CYCLES  
  578.           ELSE  ASCII u 140 +CYCLES 
  579.           THEN  EMIT >ARG  1 dism-size !  .SOURCE  OPP/9  ,DREG   
  580.    ELSE    OPP $ 1F0 AND $ 100 = 
  581.           IF    ." sbcd"  .BYTE OPP/9 OPP  3?
  582.                 IF     .-A@  .,  .-A@ 18 
  583.                 ELSE  .DREG  ,DREG     8
  584.                 THEN  +CYCLES 
  585.           ELSE  ." or" .SIZE   OPP/9   8?
  586.                 IF     .DREG    ,SOURCE   8 2 
  587.                 ELSE   .SOURCE  ,DREG     4 2 
  588.                 THEN   +IF-LONG 
  589.           THEN
  590.    THEN     ;
  591.  
  592. : NIB9  ( --- ) OPP/9
  593.   CONDITION OPP $ C0 AND $ C0 =  ( OPP/9  FLAG )
  594.     IF    ." suba"   8?  1+ DISM-SIZE ! .SIZE  .SOURCE ,AREG 
  595.           8 +CYCLES  -2 +MEM     
  596.     ELSE  OPP $ 130 AND $ 100 =  ( OP/9 FLAG )    8 +CYCLES  APPROX ON 
  597.     IF   ." subx" .SIZE   OPP  3?
  598.          IF      .-A@   .,   .-A@  [ DECIMAL ]     18 12  
  599.          ELSE   .DREG ,DREG                         4 4  
  600.          THEN   +IF-LONG 
  601.     ELSE   ." sub" .SIZE     8? NOT
  602.            IF   ( => EA )  .SOURCE  ,DREG  4 2     
  603.            ELSE  ( ->DN )  .DREG  ,SOURCE  4 2  ( +2 IF DN )  APPROX ON
  604.            THEN  +IF-LONG 
  605.   ENDCOND   ;
  606.  
  607. : NIB11  ( --- ) OPP/9
  608.  CONDITION  6 2 @OPP-BITS  3 =
  609.      IF    ." cmpa"  8? 1+ DISM-SIZE ! .SIZE  .SOURCE ,AREG  6 +CYCLES 
  610.      ELSE  8?   NOT
  611.      IF    ." cmp"  .SIZE .SOURCE  ,DREG   4 2 +IF-LONG
  612.      ELSE  3 3 @OPP-BITS 1 =
  613.      IF    ." cmpm"  .SIZE  OPP   .A@+  .,  .A@+  12 8 +IF-LONG    
  614.      ELSE   ." eor"  .SIZE .DREG ,SOURCE    8 4 +IF-LONG 
  615.  ENDCOND ;
  616.  
  617. DECIMAL
  618. : .MUL  (  --- )  OPP/9   6&7?
  619.     IF    8?
  620.          IF     ." muls"   
  621.          ELSE   ." mulu"
  622.          THEN    >ARG .SOURCE ,DREG  70 +CYCLES
  623.     ELSE  8?  ." and"  .SIZE
  624.         IF     .DREG  ,SOURCE  8 4 
  625.         ELSE   .SOURCE ,DREG   4 2  
  626.         THEN   +IF-LONG 
  627.     THEN  ;
  628.  
  629. : .EXG    ." exg" >ARG ;
  630.  
  631. : NIB12  ( --- ) OPP/9 OPP   DUP $ 1F8 AND
  632.   CASE
  633.     $ 188  OF  .EXG  .AREG ,DREG  ENDOF
  634.     $ 148  OF  .EXG  .AREG ,AREG  ENDOF
  635.     $ 140  OF  .EXG  .DREG ,DREG  ENDOF
  636.       >R  ( OP-9-ROT OPP  )  OPP   $ 1F0 AND $ 100 =
  637.       IF   3?    ." abcd"  .BYTE  ( ... op9-rot opp flag )
  638.            IF      .-A@ .,  .-A@  [ DECIMAL ]  18 
  639.            ELSE  .DREG ,DREG  8   
  640.            THEN  +CYCLES 
  641.       ELSE  DDROP .MUL
  642.       THEN  RDROP EXIT 
  643.    ENDCASE  6 +CYCLES ;
  644.  
  645. \ 00001 fix "rot" -> "ro"
  646. 4 $TABLE  .ROT$  "as"  "ls" "rox" "ro"
  647.  
  648. : .ROTLR  ( --- )   3 AND  .ROT$  8?
  649.     IF    ASCII l  
  650.     ELSE  ASCII r   
  651.     THEN  EMIT  ;
  652.  
  653. : NIB14 (  --- ) 6&7?
  654.     IF    OPP/9  .ROTLR  1 size$ ( 00001 ) .SOURCE
  655.           8 +CYCLES
  656.     ELSE  OPP/3  .ROTLR  .SIZE  ( REG )  OPP/9  5?
  657.           IF    .DREG             
  658.           ELSE  7 AND  .#  .NUM   
  659.           THEN   OPP ,DREG   6 2 +IF-LONG 
  660.    THEN   ;
  661.  
  662. DECIMAL
  663. : NIB13  ( --- ) OPP/9
  664.  CONDITION  OPP $ C0 AND $ C0 =  ( OPP/9  FLAG )
  665.    IF    ." adda"  8? 1+ DISM-SIZE ! .SIZE  .SOURCE ,AREG  
  666.          8 +CYCLES  -2 +MEM 
  667.    ELSE  OPP  $ 130 AND $ 100 =
  668.    IF      ." addx"  .SIZE  ( OP/9 ) OPP  3?
  669.            IF      .-A@  .,   .-A@   18 12 
  670.            ELSE  .DREG      ,DREG         4   4 
  671.            THEN   +IF-LONG 
  672.    ELSE    ." add"  .SIZE   8?
  673.            IF    ( ->DN )   .DREG   ,SOURCE  4 2 ( +2 IF DN )  APPROX ON 
  674.            ELSE  ( => EA )  .SOURCE ,DREG    4 2  
  675.            THEN   +IF-LONG 
  676.    ENDCOND  ;
  677.  
  678. DECIMAL 16 FIG-VAR DISM-BASE
  679. UNCODE DEFINITIONS
  680. TRUE FIG-VAR .DISM#
  681.  
  682. : .ADDRESS   ( --- ) ( .DISM# @ )
  683.     ( IF )   BASE @ >R DISM-BASE @ BASE !  CR 0 OUT !
  684.              DISM-ADR @ .ADR    R> BASE !
  685.     ( THEN ) OPCODE-COL @ COLUMN  ;
  686.  
  687. : .16bit ( n1 -- )
  688.   4 0
  689.   DO    dup $ f000 and  -12 shift .hx  4 shift
  690.   LOOP  drop  ;
  691.  
  692. : .CODES ( ADR --- )  .DISM# @
  693.     IF    CODE-COL @ COLUMN     DISM-ADR @ SWAP
  694.           DO       I W@  ( 5 .R )  space .16bit
  695.           2 +LOOP  
  696.     ELSE DROP
  697.     THEN  ;
  698.  
  699. : .:   ( --- )  ." :" ;
  700. variable  CLOCK 7 CLOCK ! 
  701. variable  TOTAL-CYCLES 
  702.  
  703. : .CYCLES  ( op-adr --- )
  704.   CYCLE-COL @ COLUMN
  705.   SHOW-CYCLES @
  706.   IF
  707.      drop  ( -- )  .(  #CYCLES @ 2 .R  #CYCLES/ @ DUP 
  708.      IF
  709.         DUP  ." +" 0 .R ." /" 
  710.      THEN
  711.      DROP .: #CYCLES @ TOTAL-CYCLES @ + 
  712.      DUP TOTAL-CYCLES !    3 .R   TOTAL-CYCLES @ CLOCK @ / .: 2 .R  
  713.      .) APPROX @
  714.      IF
  715.         ASCII ? EMIT      
  716.      THEN ( FINAL-COL @ COLUMN )
  717.   ELSE
  718.      ascii " emit
  719.      dism-adr @ swap
  720.      DO
  721.         i c@  dup ?visible 0=
  722.         IF
  723.            drop ascii .
  724.         THEN
  725.         emit
  726.      LOOP
  727.      ascii " emit
  728.   THEN   ;
  729.  
  730. ONLY FORTH ALSO UNCODE DEFINITIONS 
  731. DECIMAL
  732.  
  733. : INIT-DISM-WORD  ( ADR --- )  DISM-ADR !  
  734.   .ADDRESS  
  735.    DISM-ADR @ ?EVEN W@ OPCODE !
  736.    NEW-DISM-ADR OFF
  737.    #CYCLES      OFF
  738.    #CYCLES/     OFF
  739.    APPROX       OFF
  740.    MEM          OFF
  741.    DOING-CALL   OFF
  742.    dc.w?        off ;
  743.  
  744. ONLY FORTH UNCODE ALSO FORTH DEFINITIONS
  745. : DISM-DONE? ( --- FLAG )   NEW-DISM-ADR @
  746.      IF   NEW-DISM-ADR @  ?EVEN DISM-ADR     !  
  747.           NEW-DISM-ADR OFF
  748.      THEN  DISM-DONE @  ;
  749.  
  750. 1 .IF
  751.  
  752. \ Thanx to Marty Kees for the 68881 support...   start 00002
  753.  
  754. : .68881   ( --- )
  755.   BEGIN  out @  opcode-col @ >
  756.   WHILE  bsout @ emit
  757.   REPEAT 
  758.   ." 68881{ " >ARG  OPP .num   
  759.   OPP $ F23C =
  760.   IF
  761.      dism-adr @ 2+ w@ $ 1c00 and -10 shift
  762.      CASE       \ size of immediate + 4 byte opcode
  763.         0 OF 8  \ .l long
  764.           ENDOF
  765.         1 OF 8  \ .s single
  766.           ENDOF
  767.         2 OF 16 \ .x extended
  768.           ENDOF
  769.         3 OF 16 \ .p packed d r
  770.           ENDOF
  771.         4 OF 6  \ .w word
  772.           ENDOF
  773.         5 OF 12 \ .d double
  774.           ENDOF 
  775.         6 OF 6  \ .b byte but stored as word
  776.           ENDOF
  777.         4 swap
  778.       ENDCASE
  779.       2- dup dism-adr @ + ?even dism-adr ! 
  780.       dism-size !
  781.   ELSE
  782.       a2+
  783.   THEN
  784.   DC.W? ON   
  785. ;
  786.  
  787. : DISM-WORD?  ( Adr --- Adr+ Flag )
  788.   (COMMAS) @ >R NO-COMMAS INIT-DISM-WORD   ( -- )
  789.   BASE @ >R DISM-BASE @ BASE !   DISM-ADR @  >R  
  790.     SET-SIZE  12 4 @OPP-BITS
  791.     SELECT
  792.        NIB0 NIB1-3  NIB1-3  NIB1-3 NIB4   NIB5  NIB6  .MOVEQ
  793.        NIB8 NIB9    .DW     NIB11  NIB12  NIB13 NIB14 .68881
  794.     END-SELECT  A2+ 
  795.   R@ .CODES DECIMAL r> .CYCLES  R> BASE ! DISM-ADR @ DISM-DONE? 
  796.   R> (COMMAS) !  3 X>R ?PAUSE 3 XR> 
  797. ;    \ end 00002
  798.  
  799. .ELSE
  800.  
  801. : DISM-WORD?  ( Adr --- Adr+ Flag )
  802.   (COMMAS) @ >R NO-COMMAS INIT-DISM-WORD   ( -- )
  803.   BASE @ >R DISM-BASE @ BASE !   DISM-ADR @  >R  
  804.     SET-SIZE  12 4 @OPP-BITS
  805.     SELECT
  806.        NIB0 NIB1-3  NIB1-3  NIB1-3 NIB4   NIB5  NIB6  .MOVEQ
  807.        NIB8 NIB9    .DW     NIB11  NIB12  NIB13 NIB14 .DW
  808.     END-SELECT  A2+ 
  809.   R@ .CODES DECIMAL r> .CYCLES  R> BASE ! DISM-ADR @ DISM-DONE? 
  810.   R> (COMMAS) !  3 X>R ?PAUSE 3 XR> ;
  811.  
  812. .THEN
  813.  
  814. : INIT-DISM ( FROM --- ) ?EVEN  START-ADR !  
  815.    $ -8000,0000 HIGH-BRANCH !
  816.    DISM-DONE     OFF 
  817.    TOTAL-CYCLES  OFF  ;
  818.  
  819. ONLY FORTH DEFINITIONS
  820.  
  821. false FIG-VAR DISM-CYCLES     TRUE FIG-VAR DISM-NAMES
  822.  
  823. : SELECT-DISM-DEFAULTS  ( -- , select the system default dism state )
  824.   [ ALSO UNCODE ]   DISM-CYCLES @ SHOW-CYCLES !
  825.                     DISM-NAMES  @ .REGNAMES?  !   [ PREVIOUS ]  ;
  826.  
  827. ONLY FORTH ALSO UNCODE DEFINITIONS
  828. : <DISM>  ( ADR --- )  DUP INIT-DISM
  829.     SELECT-DISM-DEFAULTS
  830.     BEGIN   DISM-WORD? 
  831.     UNTIL   DROP  CR  ;
  832.  
  833. ONLY FORTH UNCODE ALSO FORTH DEFINITIONS
  834.  
  835. : DISM  ( ADR --- )
  836.   DISM-ORIGIN OFF  <DISM> ;
  837.  
  838. : RELDISM  ( origin-adr dism-adr -- )
  839.   swap DISM-ORIGIN !  <DISM>  ;
  840.  
  841. : RISM  ( ADR --- ) ( * RELATIVE DISM )
  842.   DUP DISM-ORIGIN !  <DISM> ;
  843.  
  844. : ADISM  ( abs-adr --- )
  845.   DUP >REL SWAP OVER - NEGATE DISM-ORIGIN ! <DISM> ;
  846.  
  847. .NEED $SKIP
  848. : $SKIP  ( ADR --- ADR' )  DUP $SIZE + ;
  849. .THEN
  850.  
  851. ( 00005 )  variable THE-CFA
  852. DECIMAL 
  853.  
  854. : DEF  ( --- )    SELECT-DISM-DEFAULTS
  855.     DISM-ORIGIN OFF
  856.     [COMPILE]  '     BASE @ >R  HEX   
  857.     DUP   DUP>R     DUP INIT-DISM 
  858.     BEGIN  DUP   W@ ( adr opcode )  
  859.  
  860.            CONDITION DUP BSR-CODE =
  861.                IF   drop dup 2+ dup w@ w->s + THE-CFA !
  862.                ELSE DUP  jsr-code  =
  863.                IF   drop dup 2+ @ >rel THE-CFA !
  864.                ELSE DUP JSR+64K-CODE =
  865.                IF   drop dup 2+ w@ w->s $ 1,0000 + THE-CFA !
  866.                ELSE DUP JSR+ORG-CODE =
  867.                IF   drop dup 2+ w@ w->s THE-CFA !
  868.                ELSE drop THE-CFA OFF
  869.            ENDCOND  
  870.              1 rpick base !   
  871.              DISM-WORD?  
  872.              hex
  873.              >R  THE-CFA @ ' (.")       = 
  874.                  THE-CFA @ ' ($")       =  OR 
  875.                  THE-CFA @ ' (?ABORT")  =  OR
  876.            IF       cr CR  ." '"  DUP $TYPE $SKIP ." '"  CR
  877.            THEN R> 
  878.     UNTIL 2DROP r@ >NAME  
  879.     >newline  cr dup id. ."  is "  IMMEDIATE?  
  880.     IF    ." IMMEDIATE, "
  881.     THEN  r> r> base !   
  882.     dup  DISM-ADR @ - ABS  dup 1 .r ."  bytes long ("  
  883.           CELL/ .  ." cells), defined as '"
  884.           CELL- @
  885.           CONDITION
  886.             dup 0<              IF   drop ." inline'"  ELSE
  887.             dup $ 4000,0000 and IF   drop ." called'"  ELSE
  888.             drop ." both'"
  889.           ENDCOND
  890.     CR CR   ;
  891.  
  892. : SEE DEF ;
  893. only forth definitions
  894. DECIMAL
  895.  
  896.  
  897.